package org.jsola.hr.service.notice;

import org.jsola.contract.dto.SignWeiXinSendDTO;
import org.jsola.hr.entity.EmpInfoDO;
import org.jsola.hr.entity.EventHandlingDO;
import org.jsola.hr.entity.MemoInfoDO;
import org.jsola.hr.entity.TaskDO;
import org.jsola.user.core.TokenUser;

import java.util.List;

/**
 * 发送通知
 *
 * @author wcl
 */
public interface ISendNoticeService {

    /**
     * 发送人员变动相关通知（发给管理员）
     *
     * @param subjectIds     业务id
     * @param idType         业务id类型(1:empId 2:empChangeId)
     * @param noticeTypeCode 通知类型code
     * @param isFixedNotice  是否固定通知
     */
    void sendPersonnelNotice(String subjectIds, Integer idType, String noticeTypeCode, Boolean isFixedNotice);

    /**
     * 发送社保增减员相关通知
     *
     * @param empId                 员工id
     * @param increaseDecreaseCount 增减员数量
     * @param companyId             公司Id
     * @param sourceSoc             是不是增减员的时候调用这个方法的
     */
    void sendIncreaseDecreaseNotice(String empId, String companyId, int increaseDecreaseCount, Boolean sourceSoc);

    /**
     * 发送合同到期提醒
     *
     * @param task           taskDo
     * @param contractIds    合同id
     * @param noticeTypeCode 通知类型code
     * @param isFixedNotice  是否固定通知
     */
    void sendContractExpireNotice(TaskDO task, String contractIds, String noticeTypeCode, Boolean isFixedNotice);

    /**
     * 事件处理(服务反馈)发送提醒
     *
     * @param companyId     用工单位Id
     * @param eventHandling 事件
     * @param tokenUser     当前用户
     */
    void sendEventHandlingNotice(String companyId, EventHandlingDO eventHandling, TokenUser tokenUser);

    /**
     * 甲方端合同到期发送提醒
     *
     * @param companyId 用工单位Id
     * @param subjectId 服务Id
     */
    void sendJfContractNotice(String companyId, String subjectId);

    /**
     * 人事发微信
     *
     * @param empName        员工姓名
     * @param size           人员数量
     * @param companyName    公司名称
     * @param userIdList     用户id集合
     * @param isFixedNotice  是否固定通知
     * @param noticeTypeCode 通知类型code
     * @param tokenUser      当前用户
     */
    void personnelSendWeChat(String empName, int size, String companyName, List<String> userIdList, Boolean isFixedNotice,
                             String noticeTypeCode, TokenUser tokenUser);

    /**
     * 备忘录发通知
     *
     * @param companyId  用工单位id
     * @param memoInfoDO 备忘录信息
     * @param tokenUser  当前用户
     */
    void memoRemindSendNotice(String companyId, MemoInfoDO memoInfoDO, TokenUser tokenUser);

    /**
     * 发合同到期相关微信（发给员工）
     *
     * @param empName       员工姓名
     * @param size          人员数量
     * @param companyName   公司名称
     * @param userIdList    用户id集合
     * @param isFixedNotice 是否固定通知
     * @param tokenUser     当前用户
     */
    void contractSendWeChat(String empName, int size, String companyName, List<String> userIdList, Boolean isFixedNotice, TokenUser tokenUser);

    /**
     * 工资卡变更发微信（发给管理员）
     *
     * @param empInfo   员工信息
     * @param userList  用户id集合
     * @param tokenUser 当前用户
     */
    void salaryCardChangeSendWeChat(EmpInfoDO empInfo, List<String> userList, TokenUser tokenUser);

    /**
     * 备忘录发微信（发给管理员）
     *
     * @param companyId  用工单位id
     * @param memoInfoDO 备忘录信息
     * @param userIdList 发送的用户id
     * @param tokenUser  当前用户
     */
    void memoInfoSendWeChat(String companyId, MemoInfoDO memoInfoDO, List<String> userIdList, TokenUser tokenUser);

    /**
     * 工资卡信息变更发通知
     *
     * @param empInfoChange 员工信息
     * @param companyId     用工单位id
     * @param tokenUser     当前用户
     */
    void salaryChangeSendNotice(EmpInfoDO empInfoChange, String companyId, TokenUser tokenUser);

    /**
     * 合同企业单方签署发送通知
     *
     * @param weiXinSendList 发送参数
     * @param tokenUser      当前用户
     */
    void sendWaitViewWeiXinTemp(List<SignWeiXinSendDTO> weiXinSendList, TokenUser tokenUser);

    /**
     * 异步发送有合同待签署-微信公众号或短信模板消息
     *
     * @param weiXinSendList 要发送的人
     * @param subjectName    用工单位名称
     * @param tokenUser      当前用户
     */
    void sendWaitSignWeiXinTemp(List<SignWeiXinSendDTO> weiXinSendList, String subjectName, TokenUser tokenUser);
}
